|
|
![]() | |
|
|
|
To access the contents, click the chapter and section titles.
Fast Track Visual C++ 6.0 Programming
Listing 2.2 MDIView.h and MDIView.cpp
// MDIView.h : interface of the CMDIView class
//
/////////////////////////////////////////////////////////////////////////////
#if
!defined(AFX_MDIVIEW_H__81CAFB2F_9C82_11D1_887F_D42B07C10710__INCLUDED_)
#define AFX_MDIVIEW_H__81CAFB2F_9C82_11D1_887F_D42B07C10710__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CMDIView : public CView
{
protected: // create from serialization only
CMDIView();
DECLARE_DYNCREATE(CMDIView)
// Attributes
public:
CMDIDoc* GetDocument();
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMDIView)
public:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CMDIView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// Generated message map functions
protected:
//{{AFX_MSG(CMDIView)
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
#ifndef _DEBUG // debug version in MDIView.cpp
inline CMDIDoc* CMDIView::GetDocument()
{ return (CMDIDoc*)m_pDocument; }
#endif
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately
before the previous line.
#endif // !defined(AFX_MDIVIEW_H__81CAFB2F_9C82_11D1_887F_D42B07C10710__INCLUDED_)
// MDIView.cpp : implementation of the CMDIView class
//
#include "stdafx.h"
#include "MDI.h"
#include "MDIDoc.h"
#include "MDIView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMDIView
IMPLEMENT_DYNCREATE(CMDIView, CView)
BEGIN_MESSAGE_MAP(CMDIView, CView)
//{{AFX_MSG_MAP(CMDIView)
ON_WM_CHAR()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMDIView construction/destruction
CMDIView::CMDIView()
{
// TODO: add construction code here
}
CMDIView::~CMDIView()
{
}
BOOL CMDIView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CMDIView drawing
void CMDIView::OnDraw(CDC* pDC)
{
CMDIDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
TEXTMETRIC tm;
pDC->GetTextMetrics(&tm);
for(int loop_index = 0; loop_index <= pDoc->number_lines; loop_index++){
pDC->TextOut(0, loop_index * tm.tmHeight, pDoc->text[loop_index]);
}
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CMDIView printing
BOOL CMDIView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CMDIView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CMDIView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CMDIView diagnostics
#ifdef _DEBUG
void CMDIView::AssertValid() const
{
CView::AssertValid();
}
void CMDIView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CMDIDoc* CMDIView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMDIDoc)));
return (CMDIDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMDIView message handlers
void CMDIView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CMDIDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(nChar != '\r'){
pDoc->text[pDoc->number_lines] += nChar;
Invalidate();
}
else{
pDoc->number_lines++;
}
// TODO: Add your message handler code here and/or call default
pDoc->UpdateAllViews(this, (long) pDoc->number_lines, NULL);
pDoc->SetModifiedFlag();
CView::OnChar(nChar, nRepCnt, nFlags);
}
void CMDIView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
CClientDC dc(this);
TEXTMETRIC tm;
CMDIDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
dc.GetTextMetrics(&tm);
dc.TextOut(0, (int) lHint * tm.tmHeight, pDoc->text[lHint]);
// TODO: Add your specialized code here and/or call the base class
}
When working with multiple views, theres no reason any two views should show the same part of the same document, so lets allow the user to move around in MDI documents with scrolling views. Scrolling MDI ViewsThe MFC library provides the CScrollView class, which is a view class that supports scrolling. We put this class to work in a new example, ScrollMDI. In this example, the user is able to scroll each view independently. Create a new MDI project now named ScrollMDI. To install the CScrollView class as our view class, stop in Step 6 of the AppWizard and make sure CMDIScrollView is selected in the Class name box, as shown in Figure 2.5. Select CScrollView in the Base class box, as also shown in Figure 2.5. After youve selected CScrollView, click Finish to create the new project. The CScrollMDIView is derived from the CScrollView class, as shown in ScrollMDIView.h.
class CScrollMDIView : public CScrollView ⇐
{
protected: // create from serialization only
CScrollMDIView();
DECLARE_DYNCREATE(CScrollMDIView)
.
.
.
This means we have the CScrollView functions available to us for our own use.
To make sure we have something to scroll, we set up ScrollMDI to accept multiline text input as we did with our previous program, MDI. To do that, we add OnChar() to the view class using ClassWizard.
void CScrollMDIView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CScrollMDIDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(nChar != '\r'){
pDoc->text[pDoc->number_lines] += nChar;
Invalidate();
}
else{
pDoc->number_lines++;
}
pDoc->UpdateAllViews(this, pDoc->number_lines, NULL);
pDoc->SetModifiedFlag();
CScrollView::OnChar(nChar, nRepCnt, nFlags);
}
|
|
Products | Contact Us | About Us | Privacy | Ad Info | Home
Use of this site is subject to certain Terms & Conditions, Copyright © 1996-2000 EarthWeb Inc. All rights reserved. Reproduction whole or in part in any form or medium without express written permission of EarthWeb is prohibited. Read EarthWeb's privacy statement. |